package es.javamyadmin.ajax;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.Iterator;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import es.javamyadmin.dao.PersonalizadaDAO;
import es.javamyadmin.modelo.Tables;
import es.javamyadmin.pojo.Error;

/**
 * Servlet  que se encarga de de ejecutar la query personalizada 
 *  @author Emilio Javier Castillo y Hector Delgado Duran
 *
 */
public class QueryPersonalAjax extends HttpServlet {
       
	/**
	 * 
	 */
	private static final long serialVersionUID = 8344367416890344837L;

	/**
	 * metodo que ejecuta la sentencia creada por un usuario
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String database = request.getParameter("database");
		String user = request.getParameter("usuario");
		String pass = request.getParameter("pass");
		String server = request.getParameter("servidor");
		String puerto = request.getParameter("puerto");
		String query = request.getParameter("query");
		Error error = null;
		
		Collection<Tables> tablesRespuesta = null;
		boolean exQuery = false;
		boolean exUpdate = false;
		String jSon = "";
		
		PersonalizadaDAO queryPer = null;
		
		if(!query.trim().equals("")){
			queryPer = new PersonalizadaDAO();
			queryPer.setDatabase(database);
			queryPer.setPass(pass);
			queryPer.setPath(getServletContext().getResourceAsStream("/WEB-INF/properties/mensajes.properties"));
			queryPer.setPuerto(puerto);
			queryPer.setQuery(query);
			queryPer.setServer(server);
			queryPer.setUser(user);
			
			if(query.toLowerCase().indexOf("update") != -1 || query.toLowerCase().indexOf("truncate") != -1 || query.toLowerCase().indexOf("drop") != -1 || query.toLowerCase().indexOf("delete") != -1  || query.toLowerCase().indexOf("insert") != -1 || query.toLowerCase().indexOf("create") != -1 ){
				exUpdate = true;
				error = queryPer.update();
			}else{
				exQuery = true;
				tablesRespuesta = queryPer.query();
			}
		}
		else{
			error = new Error("Debe de introducir alguna query","null","");
		}
		
		if(exUpdate){
			if(error != null){
				if(error.getError() != null){
					if(error.getDescripcion() != null){
						jSon = "{\"ok\": \"false\",\"query\": \"false\",\"error\":{\"error\":\"" + error.getError() + "\",\"descripcion\":\"" + error.getDescripcion() + "\"}}";
					}else{
						jSon = "{\"ok\": \"false\",\"query\": \"false\",\"error\":{\"error\":\"" + error.getError() + "\",\"descripcion\":\"null\"}}";
					}
				}
				else{
					jSon = "{\"ok\": \"true\",\"query\": \"false\",\"error\":{\"error\":\"null\",\"descripcion\":\"null\"},\"mensajeOk\":\"" + error.getCambios() + "\"}";
				}
			}
			else{
				jSon = "{\"ok\": \"false\",\"query\": \"false\",\"error\":{\"error\":\"Ha ocurrido algun error\",\"descripcion\":\"null\"},\"respuesta\":\"null\"}";
			}
		}else{
			if(exQuery){
				if(tablesRespuesta != null && !tablesRespuesta.isEmpty()){
					String respuesta;
					Tables a;
					Tables b;
					Iterator<Tables> i = tablesRespuesta.iterator();
					respuesta = "<table id='lista-tablas'>";
					boolean primeraVez = true;
					int contador = 0;
					while(i.hasNext()){
						a =  i.next();
						Iterator<Tables> iTable = a.getSelect().iterator();
						respuesta = respuesta + "<tr style='cursor: default' >";
						while(iTable.hasNext()){
							b =  iTable.next();
							if(primeraVez){
								if(contador == 0){
									respuesta = respuesta + "<th class='inicio' align='center'>" + b.getContenido() + "</th>";
								}else{
									if(contador + 1 == a.getSelect().size()){
										respuesta = respuesta + "<th class='fin' align='center'>" + b.getContenido() + "</th>";
									}else{
										respuesta = respuesta + "<th  align='center'>" + b.getContenido() + "</th>";
									}
								}
								contador++;
							}else{
								respuesta = respuesta + "<td align='center'>" + b.getContenido() + "</td>";
							}
							
						}
						primeraVez = false;
						respuesta = respuesta + "</tr>";
					}
					respuesta = respuesta + "</table>";
					System.out.println(respuesta);
					jSon = "{\"ok\": \"true\",\"query\": \"true\",\"error\":{\"error\":\"null\",\"descripcion\":\"null\"},\"respuesta\":\"" + respuesta + "\"}";
				}else{
					if(error != null && error.getError() != null){
						jSon = "{\"ok\": \"false\",\"query\": \"true\",\"error\":{\"error\":\"" + error.getError() + "\",\"descripcion\":\"null\"},\"respuesta\":\"\"}";
						if(error.getDescripcion() != null){
							jSon = "{\"ok\": \"false\",\"query\": \"true\",\"error\":{\"error\":\"" + error.getError() + "\",\"descripcion\":\"" + error.getDescripcion() +  "\"},\"respuesta\":\"\"}";
						}
					}
					jSon = "{\"ok\": \"false\",\"query\": \"true\",\"error\":{\"error\":\"No se ha obtenido ningun resultado \",\"descripcion\":\"null\"},\"respuesta\":\"\"}";
				}
			}else{
				
				jSon = "{\"ok\": \"false\",\"query\": \"true\",\"error\":{\"error\":\"Ha ocurrido algun error\",\"descripcion\":\"null\"},\"respuesta\":\"null\"}";
			}
		}
		
		PrintWriter out = new PrintWriter(new OutputStreamWriter( response.getOutputStream(),"UTF8"), true);
		try{
			out.print(jSon);
		}finally{
			out.close();
		}
	}

}
